<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">











<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>standalone-archetype - Guía de desarrollo</title>
    <style type="text/css" media="all">
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
    </style>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
          <meta name="author" content="1:Carlos E. Gómez Gómez" />
          </head>
  <body class="composite">
    <div id="banner">
                  <a href="http://www.softwaresano.com" id="bannerLeft">
    
                                            <img src="img/logo.png" alt="" />
    
            </a>
                    <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
          
  

  
    
  
  
    
            <div class="xleft">
        Publicado el: 2011-01-11
                      </div>
            <div class="xright">            <a href="developerGuide.html">Normas de desarrollo</a>
            |
                <a href="index.html">Arquetipo básico</a>
            |
                <a href="maven-repositories.html">Repositorios de maven</a>
            
  

  
    
  
  
    
  </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
           
  

  
    
  
  
    
                   <h5>Descargas</h5>
            <ul>
              
    <li class="none">
                    <a href="downloads/releases.html">Releases</a>
          </li>
              
    <li class="none">
                    <a href="downloads/snapshots.html">Snapshot</a>
          </li>
              
    <li class="none">
                    <a href="changes-report.html">Release Notes</a>
          </li>
              
    <li class="none">
                    <a href="license.html">Licencia</a>
          </li>
          </ul>
              <h5>Standalone Archetype</h5>
            <ul>
              
    <li class="none">
                    <a href="index.html">Introducción</a>
          </li>
              
    <li class="none">
                    <a href="installation.html">Instalación</a>
          </li>
              
    <li class="none">
              <strong>Guía de usuario</strong>
        </li>
          </ul>
              <h5>Desarrollo</h5>
            <ul>
              
    <li class="none">
                    <a href="source-repository.html">Fuentes</a>
          </li>
              
    <li class="none">
                    <a href="integration.html">Integración continua</a>
          </li>
              
    <li class="none">
                    <a href="developerGuide.html">Normas de desarrollo</a>
          </li>
          </ul>
              <h5>Documentación del proyecto</h5>
            <ul>
              
                
              
      
            
      
            
      
            
      
            
      
            
      
            
      
            
      
            
      
            
      
            
      
              
        <li class="collapsed">
                    <a href="project-info.html">Información del proyecto</a>
                </li>
              
                
              
      
            
      
              
        <li class="collapsed">
                    <a href="project-reports.html">Informes del proyecto</a>
                </li>
          </ul>
                                                           
                        
                        
            <a href="http://pimpam.googlecode.com/" title="pimpam" class="poweredBy">
                            <img alt="pimpam" src="http://pimpam.googlecode.com/files/builtByPimpam.png" />
            </a>
                               
  

  
    
  
  
    
        </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        <div class="section"><h2>Guía de Usuario</h2>
<p>En esta guía de usuario se explica cuál es el proceso para comenzar el desarrollo de un proyecto. El proyecto generado por este arquetipo es una calculadora que suma dos números no negativos. Como ejemplo se ampliará esta calculadora para que realice la raíz cuadrada de un número positivo.</p>
<p>Los pasos a seguir en el desarrollo del proyecto son:</p>
<ul><li><a href="#Creación_de_un_proyecto_mediante_el_arquetipo">Creación de un proyecto mediante el arquetipo</a></li>
<li><a href="#Modificar_el_proyecto">Modificar el proyecto</a></li>
<li><a href="#Generación_de_la_entrega_del_proyecto">Generación de la entrega del proyecto</a></li>
<li><a href="#Ejecución_del_proyecto">Ejecución del proyecto</a></li>
<li><a href="#Integración_contínua">Integración contínua </a></li>
<li><a href="#Análisis_estático_de_código">Análisis estático de código </a></li>
<li><a href="#Generación_release">Generación release</a></li>
<li><a href="#Preparación_release_siguiente">Preparación release siguiente</a></li>
</ul>
<div class="section"><h3><a name="Creación_de_un_proyecto_mediante_el_arquetipo">Creación de un proyecto mediante el arquetipo</a></h3>
<p>Si la <a href="./maven-configuration.html">configuración de maven</a> ya se ha realizado y teniendo acceso al <a href="http://softwaresano-repomaven.googlecode.com/svn/archetypes-releases">repositorio de arquetipos</a> o al <a href="http://softwaresano-repomaven.googlecode.com/svn/archetypes-snapshots">repositorio de snapshots de arquetipos</a>. Ejecutar:</p>
<ul><li><b>Ultima versión del arquetipo (Versión de snapshot)</b><div class="source"><pre>ngsn@triatlon:~/workspace$ mvn -DarchetypeRepository=http://softwaresano-repomaven.googlecode.com/svn/archetypes-snapshots \
    -DarchetypeGroupId=es.tid.cd.archetypes -DarchetypeArtifactId=standalone-archetype -DarchetypeVersion=1.0.27-SNAPSHOT \
    -DgroupId=${newGroupId} -DartifactId=${newArtifactId} -Dpackage=${newGroupId}.${newArtifactId} -Dversion=0.0.1-SNAPSHOT \
    -DinteractiveMode=false archetype:generate</pre>
</div>
</li>
</ul>
<ul><li><b>Última versión estable</b> (Ver <a href="./downloads/releases.html">aquí</a>)<div class="source"><pre>ngsn@triatlon:~/workspace$ mvn -DarchetypeRepository=http://softwaresano-repomaven.googlecode.com/svn/archetypes-releases \
    -DarchetypeGroupId=es.tid.cd.archetypes -DarchetypeArtifactId=standalone-archetype -DarchetypeVersion=1.0.27 \
    -DgroupId=${newGroupId} -DartifactId=${newArtifactId} -Dpackage=${newGroupId}.${newArtifactId} -Dversion=0.0.1-SNAPSHOT \
    -DinteractiveMode=false archetype:generate</pre>
</div>
<p>donde:</p>
<ul><li><b>${newGroupId}</b> se sustituye por el grupo(Ej. <b>com.foo</b>) al que pertenecerá el nuevo componente que se va a generar.</li>
<li><b>${newArtifactId}</b> se sustituye por el nombre del componente (Ej. <b>calculator</b>) que se va a generar</li>
</ul>
</li>
</ul>
<div class="section"><h4><a name="Ficheros_generados">Ficheros generados</a></h4>
<p>El resultado de la ejecución anterior será un componente que implementa una calculadora que realiza la suma de dos números. Se habrá creado el directorio ${newArtifactId} con la estructura siguiente: </p>
<div class="source"><pre>.
|-- LICENSE --&gt; Fichero de licencia bajo el que se distribuye este software
|-- README --&gt; Descripción necesaria para poner en funcionamiento el componente
|-- RELEASE_NOTES --&gt; Listado de todas las funcionalidades y errores corregidos en cada versión
|-- pom.xml --&gt; Fichero de generación del proyecto
`-- src
    |-- changes
    |   `-- changes.xml --&gt; Descripción de cada una de las versiones del componente. Utilizado por los plugins
    |-- main
    |   |-- assembly
    |   |   `-- dep.xml --&gt; Define como se empaqueta una aplicación
    |   |-- filters
    |   |   |-- development.properties --&gt; Propiedades para el entorno de desarrollo.
    |   |   |-- integration.properties --&gt; Propiedades para el entorno de integración.
    |   |   `-- production.properties  --&gt; Propiedades para el entorno de producción. 
    |   |-- java
    |   |   `-- com
    |   |       `-- foo
    |   |           |-- Component.java       --&gt; Interfaz del componente
    |   |           |-- impl
    |   |           |   `-- Component.java   --&gt; Interfaz que implementa el componente   
    |   |           `-- main
    |   |               `-- Bootstrap.java   --&gt; Arranque o parada de la aplicación que hace uso del componente  
    |   |-- resources
    |   |   |-- main.properties --&gt; Fichero de configuración del componente. Contiene variables de entorno que tendrán que ser sustituidas
    |   |   `-- log4j.xml --&gt; Fichero de configuración de las trazas con log4j. Contiene variables de entorno que tendrán que ser sustituidas
    |   `-- scripts
    |       |-- bootstrap.bat --&gt; Script de arranque/parada del componente en entornos Windows
    |       |-- bootstrap.sh  --&gt; Script de arranque/parada del componente en entornos Linux/Unix/Leopard  
    |       |-- install.bat   --&gt; Script de instalación del componente en entornos Windows
    |       |-- install.sh    --&gt; Script de instalación del componente en entornos Linux/Unix/Leopard
    |       |-- shutdown.bat  --&gt; Script de parada del componente en entornos Windows
    |       |-- shutdown.sh   --&gt; Script de parada del componente en entornos Linux/Unix/Leopard 
    |       |-- startup.bat   --&gt; Script de arranque del componente en entornos Windows
    |       |-- status.sh     --&gt; Script de status del componente en entornos Linux/Unix/Leopard
    |       |-- status.bat    --&gt; Script de status del componente en entornos Windows
    |       |-- startup.sh    --&gt; Script de arranque del componente en entornos Linux/Unix/Leopard
    |       |-- uninstall.bat --&gt; Script de desinstalación del componente en entornos Windows
    |       `-- uninstall.sh  --&gt; Script de desinstalación del componente en entornos Linux/Unix/Leopard
    |-- site
    |   |-- apt
    |   |   |-- compilation.apt.vm    --&gt; Procedimiento de compilación del componente
    |   |   |-- developerGuide.apt.vm --&gt; Normas que ha de seguir el desarrollador del componente
    |   |   |-- downloads 
    |   |   |   |-- releases.apt.vm   --&gt; Diferentes versiones del componente 
    |   |   |   `-- snapshots.apt.vm  --&gt; Diferentes versiones de snapshot del componente
    |   |   |-- index.apt.vm          --&gt; Página inicial de la documentación del componente
    |   |   |-- installation.apt.vm   --&gt; Procedimiento de instalación del componente
    |   |   `-- useSample.apt.vm      --&gt; Un ejemplo de uso del componente   
    |   |-- fml
    |   |   `-- faq.fml               --&gt; Por si se quiere hacer una sección de FAQ  
    |   |-- resources
    |   |   `-- img
    |   |       `-- logo.png          --&gt; Logo del componente   
    |   `-- site.xml                  --&gt; Estructura de la web de documentación del componente
    `-- test
        `-- java
            `-- com
                `-- foo
                    `-- test
                        |-- Component.java      --&gt; Clase de Test del componente
                        `-- mock
                            `-- Component.java  --&gt; Implementación virtual del componente</pre>
</div>
</div>
</div>
<div class="section"><h3><a name="Modificar_el_proyecto">Modificar el proyecto</a></h3>
<p>Una vez generado el proyecto con el arquetipo hay que realizar los siguiente pasos:</p>
<div class="section"><h4>Actualizar pom.xml</h4>
<p>La configuración de los diferentes plugins, así como información genérica sobre el componente (organización, descripción del proyecto,desarrolladores, etc), esta parametrizada. Los valores que cogerán estos parámetros son los que se difinieron en <a href="./maven-configuration#Configuración">configuración de maven</a>. En el caso de que este componente se introduzca dentro de un sistema de integración contínua. La <a href="./maven-configuration#Configuración">configuración de maven</a> debería ser idéntica a la que se ha utilizado para la generación del componente mediante el arquetipo. Para evitar problemas se recomiendan revisar las etiquetas [MODIFICAR].</p>
<div class="section"><h5>Revisar las etiquetas [MODIFICAR]</h5>
<p>El pom.xml generado contiene etiquetas [MODIFICAR] que han de ser revisadas, para asegurar que la configuración del componente es correcta.</p>
<div class="source"><pre>        &lt;!-- [MODIFICAR] La licencia bajo la que se distribuye el componente --&gt;
        &lt;licenses&gt;
                &lt;license&gt;
                        &lt;url&gt;LICENSE&lt;/url&gt;
                        &lt;name&gt;[MODIFICAR] License, Version 2.0&lt;/name&gt;
                        &lt;distribution&gt;[MODIFICAR] &lt;/distribution&gt;
                &lt;/license&gt;
        &lt;/licenses&gt;
        &lt;!-- [MODIFICAR] Fijar el desarrollador por defecto y añadir
             el resto de desarrolladores  --&gt;
        &lt;developers&gt;
                &lt;developer&gt;
                        &lt;id&gt;${userId}&lt;/id&gt;
                        &lt;name&gt;${userName}&lt;/name&gt;
                        &lt;email&gt;${userMail}&lt;/email&gt;
                        &lt;roles&gt;
                                &lt;role&gt;${userRole}&lt;/role&gt;
                        &lt;/roles&gt;
                        &lt;organization&gt;${userOrganization}&lt;/organization&gt;
                        &lt;timezone&gt;+1&lt;/timezone&gt;
                &lt;/developer&gt;
        &lt;/developers&gt;
        &lt;!-- Entorno de integración contínua --&gt;
        &lt;!-- [MODIFICAR] Añadir todos los correos a los que llegarán 
                 las notificaciones de errores o solución de errores --&gt; 
        &lt;ciManagement&gt;
                &lt;system&gt;${continuumsIntegrationSystem}&lt;/system&gt;
                &lt;url&gt;${continuumsIntegrationSystemUrl}&lt;/url&gt;
                &lt;notifiers&gt;
                        &lt;notifier&gt;
                                &lt;type&gt;mail&lt;/type&gt;
                                &lt;sendOnError&gt;true&lt;/sendOnError&gt;
                                &lt;sendOnFailure&gt;true&lt;/sendOnFailure&gt;
                                &lt;sendOnSuccess&gt;false&lt;/sendOnSuccess&gt;
                                &lt;sendOnWarning&gt;false&lt;/sendOnWarning&gt;
                                &lt;configuration&gt;
                                        &lt;address&gt;${userMail}&lt;/address&gt;
                                &lt;/configuration&gt;
                        &lt;/notifier&gt;
                        &lt;!-- [AÑADIR] nuevas notificaciones --&gt;
                        &lt;notifier&gt;
                                &lt;type&gt;mail&lt;/type&gt;
                                &lt;sendOnError&gt;true&lt;/sendOnError&gt;
                                &lt;sendOnFailure&gt;true&lt;/sendOnFailure&gt;
                                &lt;sendOnSuccess&gt;false&lt;/sendOnSuccess&gt;
                                &lt;sendOnWarning&gt;false&lt;/sendOnWarning&gt;
                                &lt;configuration&gt;
                                        &lt;address&gt;usuario1@foo.com&lt;/address&gt;
                                &lt;/configuration&gt;
                        &lt;/notifier&gt;
                        &lt;notifier&gt;
                                &lt;type&gt;mail&lt;/type&gt;
                                &lt;sendOnError&gt;true&lt;/sendOnError&gt;
                                &lt;sendOnFailure&gt;true&lt;/sendOnFailure&gt;
                                &lt;sendOnSuccess&gt;false&lt;/sendOnSuccess&gt;
                                &lt;sendOnWarning&gt;false&lt;/sendOnWarning&gt;
                                &lt;configuration&gt;
                                        &lt;address&gt;usuario2@foo.com&lt;/address&gt;
                                &lt;/configuration&gt;
                        &lt;/notifier --&gt;
                &lt;/notifiers&gt;
        &lt;/ciManagement&gt;
        &lt;!-- Configuración del SCM (SVN) --&gt;
        &lt;!-- [MODIFICAR] Poner las urls del SVN correspondiente, sin utilizar propiedades --&gt;
        &lt;scm&gt;
                &lt;connection&gt;scm:svn:http://pimpam.googlecode.com/svn/trunk/standalone-archetype&lt;/connection&gt;
                &lt;developerConnection&gt;scm:svn:https://pimpam.googlecode.com/svn/trunk/standalone-archetype&lt;/developerConnection&gt;
                &lt;url&gt;http://pimpam.googlecode.com/svn/trunk/standalone-archetype&lt;/url&gt;
        &lt;/scm&gt;
        
        
                                &lt;!-- [MODIFICAR] Modificar la configuración del servidor de correo, así
                                como quién envía el correo y quiénes lo reciben. --&gt;
                                &lt;configuration&gt;
                                        &lt;fromDeveloperId&gt;${userMail}&lt;/fromDeveloperId&gt;
                                        &lt;smtpHost&gt;${mailsender}&lt;/smtpHost&gt;
                                        &lt;smtpPort implementation=&quot;java.lang.Integer&quot;&gt;25&lt;/smtpPort&gt;
                                        &lt;toAddresses&gt;
                                                &lt;toAddress implementation=&quot;java.lang.String&quot;&gt;${userMail}&lt;/toAddress&gt;
                                                &lt;!-- toAddress implementation=&quot;java.lang.String&quot;&gt;usuario1@foo.com&lt;/toAddress&gt;
                                                &lt;toAddress implementation=&quot;java.lang.String&quot;&gt;usuario2@foo.com&lt;/toAddress&gt;
                                                &lt;toAddress implementation=&quot;java.lang.String&quot;&gt;usuario3@foo.com&lt;/toAddress --&gt;
                                        &lt;/toAddresses&gt;
                                &lt;/configuration&gt;</pre>
</div>
</div>
</div>
<div class="section"><h4>Implementar el proyecto</h4>
<p>El proyecto implementado por defecto es una calculadora que únicamente realiza la suma, para la cual se han generado test-unitarios, y se utilizado una implementación virtual (Mock). Como ejemplo se ampliara esta calculadora para que calcule también la raíz cuadrada. Los pasos a seguir son: </p>
<div class="section"><h5><a name="Implementar_los_tests_necesarios_para_probar_el_método_SQRT">Implementar los tests necesarios para probar el método SQRT</a></h5>
<p>Añadir a la clase <b>test/java/com/foo/test/Component.java</b> los dos métodos que comprobarán que la raiz cuadrada está implementada correctamente. Un método que comprueba que la raíz cuadrada de un número negativo no existe, y devuelve una excepción y otro para que calcule la ráiz cuadrada de un número.</p>
<div class="source"><pre>        /**
         * Test the negative &lt;code&gt;sqrt&lt;/code&gt; operation. This test must throw an &lt;code&gt;IllegalArgumentException&lt;/code&gt;
         */
        @Test(expected=IllegalArgumentException.class)
        public void testNegativeSqrt() {
                component.sqrt((double)-1);
                
        }
        /**
         * Test the &lt;code&gt;sqrt&lt;/code&gt; operation
         */
        @Test
        public void testSqrt() {
                assertEquals(2, component.sqrt((double)4),0);
        }</pre>
</div>
</div>
<div class="section"><h5><a name="Ampliar_el_interfaz_Component">Ampliar el interfaz Component</a></h5>
<p>Añadir al interfaz <b>src/main/java/com/foo/Component.java</b> el método sqrt con su correspondiente javadoc</p>
<div class="source"><pre>     /**
     * This method calculates the square root of a number
     * @param a Primer operando
     * @return  The square root of &lt;TT&gt;a&lt;/TT&gt; 
     * @exception  IllegalArgumentException This exception is launched when &lt;TT&gt;a&lt;TT&gt; is a negative number.
         */
        public double sqrt(double a);</pre>
</div>
</div>
<div class="section"><h5><a name="Modificar_la_clase_virtualMock_que_implementa_la_interfaz_Component">Modificar la clase virtual(Mock) que implementa la interfaz Component</a></h5>
<p>Añadir al método getInstance los resultados esperados cuando se calcula la raíz cuadrada de -1 y la raíz cuadrada de 4</p>
<div class="source"><pre>                //Cuando se invoque el método sqrt con valor -1
                allowing(component).sqrt((double) -1);
                //Se lanzará una excepción
                will(throwException(new IllegalArgumentException(
                        &quot;No existe la raíz cuadrada de un numero negativo&quot;)));
                //Si se invoca con el valor 4
                allowing(component).sqrt((double) 4);
                //El resultado será 2
                will(returnValue((double) 2));</pre>
</div>
</div>
<div class="section"><h5><a name="Implementar_el_nuevo_método_SQRT">Implementar el nuevo método SQRT</a></h5>
<p>Añadir a la clase <b>src/main/java/com/foo/impl/Component.java</b> el método sqrt.</p>
<div class="source"><pre>        /**
         * This method calculates the square root of a number
         * @param a Primer operando
         * @return  The square root of &lt;TT&gt;a&lt;/TT&gt;
         * @exception  IllegalArgumentException This exception is launched when &lt;TT&gt;a&lt;TT&gt; is a negative number.
         */
         public double sqrt(final double a){
                if (LOG.isDebugEnabled()){
                        LOG.debug(format(&quot;Calculando la raíz cuadrada de [{0}]&quot;,
                             new Object[]{a}));
                }
                if (a&lt;0) {
                    throw new IllegalArgumentException(&quot;The operand is a negative number&quot;);
                }
        final double result = Math.sqrt(a);
                if (LOG.isDebugEnabled()){
                        LOG.debug(format(&quot;Resultado = {0}&quot;, new Object[]{result}));
                }
                return result;
        }; </pre>
</div>
</div>
<div class="section"><h5>Añadir la nueva funcionalidad a la aplicación desarrollada con este componente</h5>
<p>Añadir el método <b>start</b> de la clase <b>src/main/java/com/foo/main/Bootstrap</b> la invocación del método que calcula la raíz cuadrada</p>
<div class="source"><pre>        System.out.println(format&quot;sqrt(4) = {0}&quot;,new Object[]{component.sqrt(4)});
        System.out.println(format(&quot;sqrt(-1) = {0}&quot;),new Object[]{component.sqrt(-1)});</pre>
</div>
</div>
<div class="section"><h5>Añadir en changes.xml la nueva funcionalidad implementada</h5>
<p>Añadir al fichero <b>src/changes/changes.xml</b></p>
<div class="source"><pre>      &lt;action dev=&quot;carlosg&quot; type=&quot;add&quot;&gt;
         Cálculo de la raíz cuadrada
      &lt;/action&gt;</pre>
</div>
</div>
</div>
</div>
<div class="section"><h3><a name="Generación_de_la_entrega_del_proyecto">Generación de la entrega del proyecto</a></h3>
<p>Para la generación y entrega del proyecto basta con ejecutar</p>
<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn clean  install  deploy assembly:assembly site:site site:deploy -Pdevelopment</pre>
</div>
<ul><li><b>clean</b>: Borra una antigua ejecución del proyecto</li>
<li><b>compile</b>: Compila los fuentes</li>
<li><b>test</b>: Pasa los tests unitarios</li>
<li><b>package</b>: Empaqueta el proyecto</li>
<li><b>install</b>: Instala el componente <b>calculator-0.0.1-SNAPSHOT.jar</b> en $HOME/.m2/repository/com/foo/calculator</li>
<li><b>deploy</b>: Instala el componente <b>calculator-0.0.1-SNAPSHOT.jar</b> en http://softwaresano-repomaven.googlecode.com/svn/archetypes-snapshots</li>
<li><b>assembly:assembly</b>: Genera un fichero *.tar.gz, *.tar.bz y un *.zip, con el proyecto empaquetado. Para ejecutar el proyecto basta con descomprimir el paquete, ir al directorio bin y ejecutar ./startup.sh ó ./startup.bat. Ver NOTA2</li>
<li><b>site</b>: Compila la documentación del proyecto</li>
<li><b>site:deploy</b>: Despliega la documentación del proyecto en scm:svn:https://softwaresano-repomaven.googlecode.com/svn/sites/es.tid.cd.archetypes/standalone-archetype</li>
<li><b>-Pdevelopment</b>: Activa el perfil de desarrollo<p>NOTA1: La ejecución de deploy implica install --&gt; package --&gt; test --&gt; compile --&gt; clean. </p>
<p>NOTA2: Se ha configurado en la fase de <b>install</b> la generación de los assemblies (*.tar.gz, *.zip, y *.tar.bz), esto evita generar los assemblies mediante mvn assembly:assembly . Ver la configuración del plugin <b>maven-assembly-plugin</b> en el pom.xml </p>
<p>NOTA3: Si la creación del site devuelve un <b>FATAL ERROR: Java heap space</b>, añadir la variable de entorno <b>MAVEN_OPTS</b>. En el caso de sistemas LINUX (export MAVEN_OPTS=-Xmx1024m) y para WINDOWS (set MAVEN_OPTS=-Xmx1024m)</p>
</li>
<li><a name="Generación_de_la_entrega_del_proyecto_junto_documentación_del_site">Generación de la entrega del proyecto junto documentación del site</a><p>Para incluir el site en la entrega. Basta con generar con desplegar el site del proyecto de la siguiente forma:</p>
<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn clean install site:site site:deploy assembly:assembly -DrepoSiteUrl=file://localhost/$PWD/target/internal-site</pre>
</div>
</li>
</ul>
</div>
<div class="section"><h3><a name="Ejecución_del_proyecto">Ejecución del proyecto</a></h3>
<p>Descomprimir cualquiera de los tres ficheros generados(*.tar.gz, *.zip.*.bz) durante la fase de assembly en el directorio deseado.</p>
<div class="source"><pre>ngsn@triatlon:~/app$  gunzip -c calculator-1.0.27-SNAPSHOT-bin.tar.gz | tar xvf - </pre>
</div>
<p>El fichero generado por el assembly al descomprimirlo sigue la estructura siguiente: </p>
<div class="source"><pre>.
|-- LICENSE       --&gt; Fichero de licencia bajo el que se distribuye este software
|-- README        --&gt; Descripción necesaria para poner en funcionamiento el componente
|-- RELEASE_NOTES --&gt; Listado de todas las funcionalidades y errores corregidos en cada versión
|-- docs          --&gt; Site del proyecto
|-- bin
|   |-- bootstrap.bat --&gt; Script de arranque/parada del componente en entornos Windows
|   |-- bootstrap.sh  --&gt; Script de arranque/parada del componente en entornos Linux/Unix/Leopard  
|   |-- install.bat   --&gt; Script de instalación del componente en entornos Windows
|   |-- install.sh    --&gt; Script de instalación del componente en entornos Linux/Unix/Leopard
|   |-- shutdown.bat  --&gt; Script de parada del componente en entornos Windows
|   |-- shutdown.sh   --&gt; Script de parada del componente en entornos Windows 
|   |-- startup.bat   --&gt; Script de arranque del componente en entornos Windows
|   |-- startup.sh    --&gt; Script de arranque del componente en entornos Linux/Unix/Leopard
|   |-- status.sh     --&gt; Script de status del componente en entornos Linux/Unix/Leopard
|   |-- status.bat    --&gt; Script de status del componente en entornos Windows
|   |-- uninstall.bat --&gt; Script de desinstalación del componente en entornos Windows
|   `-- uninstall.sh  --&gt; Script de desinstalación del componente en entornos Linux/Unix/Leopard
|-- calculator-1.0.27-SNAPSHOT.jar  --&gt; Clases del proyecto
|-- conf
|   |-- log4j.xml       --&gt; Configuración de la trazas con log4j
|   `-- main.properties --&gt; Propiedades configurables del proyecto
`-- lib
    |-- commons-logging-1.1.1.jar --&gt; Wrapper para trazas (java.util.logging y log4j)
    `-- log4j-1.2.15.jar          --&gt; Librería de trazas</pre>
</div>
<p>Leer el fichero README.txt para saber cuáles son los pasos para poner en funcionamiento el proyecto.</p>
<div class="source"><pre>ngsn@triatlon:~/app$ cd calculator-0.0.1-SNAPSHOT
ngsn@triatlon:~/app/calculator-0.0.1-SNAPSHOT$ cat README</pre>
</div>
<p>Si la configuración es por defecto, cambiar la directorio bin y ejecutar el script ./startup.bat (entornos Windows) o ./startup.sh (entornos linux/unix/leopard). </p>
<div class="source"><pre>ngsn@triatlon:~/app/calculator-0.0.1-SNAPSHOT$ cd bin
ngsn@triatlon:~/app/calculator-0.0.1-SNAPSHOT/bin$ ./startup.sh </pre>
</div>
<p>Si no se hacen alteraciones en el classpath de la aplicación también se puede ejecutar directamente el jar generado</p>
<div class="source"><pre>ngsn@triatlon:~/app/calculator-0.0.1-SNAPSHOT/bin$ cd ..
ngsn@triatlon:~/app/calculator-0.0.1-SNAPSHOT$ java -jar calculator-0.0.1-SNAPSHOT.jar</pre>
</div>
</div>
<div class="section"><h3><a name="Integración_contínua">Integración contínua</a></h3>
<p>El sistema de integración contínua que utiliza el arquetipo es <a class="externalLink" href="https://hudson.dev.java.net/">Hudson</a>. Esta integración se a hace a través del <a class="externalLink" href="https://hudson.dev.java.net/maven-hudson-plugin">plugin de Hudson para Maven</a>. Para añadir el proyecto al sistema de integración contínua, se deberían subir todas las modificaciones al repositorio y después ejecutar:</p>
<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn hudson:add-job</pre>
</div>
</div>
<div class="section"><h3><a name="Análisis_estático_de_código">Análisis estático de código</a></h3>
<p>Si se ha <a href="maven-configuration.html">configurado</a> <a class="externalLink" href="http://sonar.codehaus.org/"> sonar</a>, podemos incluir los informes de análisis de código estático de la siguiente forma:</p>
<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn org.codehaus.sonar:sonar-maven-plugin::sonar</pre>
</div>
<p>Se puede introducir</p>
</div>
<div class="section"><h3><a name="Generación_release">Generación release</a></h3>
<p>Los pasos para generar una release son:</p>
<ul><li>Desde el entorno de desarrollo se sube el proyecto al repositorio de fuentes</li>
<li>Opcionalmente se envia un email anunciando que se va a generar una nueva versión, con los cambios que se han introducido en el chages.xml <div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn changes:announcement-mail</pre>
</div>
</li>
<li>Preparar la release<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn release:prepare -Pdevelopment</pre>
</div>
</li>
</ul>
<p>NOTA: Si la ejecución de este comando acaba con un error diciendo que ya existe la versión en el svn y no existe realmente, ejecutar el comando <b>svn up</b> y volver a ejecutar el comando anterior y ya funcionará.</p>
<ul><li>Realizar la release<div class="source"><pre>ngsn@triatlon:~/workspace/calculator$ mvn release:perform -Pdevelopment</pre>
</div>
</li>
</ul>
<p>NOTA: Con <b>release:perform</b> se hace un deploy del componente con la versión del tag creado, y se genera la documentación del proyecto. Si hay un error en la ejecución, ejecutar mvn deploy en el directorio target/checkout</p>
</div>
<div class="section"><h3><a name="Preparación_release_siguiente">Preparación release siguiente</a></h3>
<p>Cada vez que se empaqueta (fase de package) el proyecto se ejecutará el plugin <b>maven-changes-plugin</b>. Este plugin generará un fichero con los cambios de la siguiente versión, en nuestro caso, la 0.0.2-SNAPSHOT. Para ello:</p>
<p>Añadir al fichero <b>src/changes/changes.xml</b></p>
<div class="source"><pre>      &lt;release version=&quot;0.0.2&quot; date=&quot;2009-01-30&quot; description=&quot;Próxima versión&quot;&gt;
      &lt;/release&gt;</pre>
</div>
</div>
</div>

      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">&#169;  
          2011
    
          Softwaresano.com
          
  

  
    
  
  
    
  </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
